# Python issubclass 和 isinstance 函数：检查类型
'''
issubclass(cls, class_or_tuple)：检查 cls 是否为后一个类或元组包含的多个类中任意类的子类
isinstance(obj, class_or_tuple)：检查 obj 是否为后一个类或元组包含的多个类中任意类的对象
'''
# 定义一个字符串
from Xlib import xobject
hello = "Hello"

# "Hello"是str类的实例，输出True
print('"Hello"是否是str类的实例：', isinstance(hello, str))

# "Hello"是object类的子类实例，输出True
print('"Hello"是否是object类的实例：', isinstance(hello, object))

# str是object类的子类，输出True
print("str是否是object类的子类：", issubclass(str, object))

# "Hello"不是tuple类及其子类的实例，输出False
print('"Hello"是否是tuple类的实例：', isinstance(hello, tuple))

# str不是tuple类的子类，输出False
print('str是否是tuple类的子类：', issubclass(str, tuple))

# 定义一个列表
my_list = [2, 4]
# [2, 4]是list类的实例，输出True
print('[2, 4]是否是list类的实例：', isinstance(my_list, list))

# [2, 4]是object类的子类的实例，输出True
print('[2, 4]是否是object类及其子类的实例：', isinstance(my_list, object))

# list是object类的子类，输出True
print('list是否是object类的子类：', issubclass(list, object))

# [2, 4]不是tuple类及其子类的实例，输出False
print('[2, 4]是否是tuple类及其子类的实例：', isinstance([2, 4], tuple))

# list不是tuple类的子类，输出False
print('list是否是tuple类的子类：', issubclass(list, tuple))

print()

data = (20, 'fkit')
print('data是否为列表元组：', isinstance(data, (list, tuple)))

# str不是list或者tuple的子类，输出False
print('str是否为list或tuple的子类：', issubclass(str, (list, tuple)))

# str是list或tuple或object的子类，输出True
print('str是否为list或tuple或object的子类：', issubclass(str, (list, tuple, object)))

print()

## __bases__属性
class A:
    pass

class B:
    pass

class C(A, B):
    pass

print('类A的所有父类：', A.__bases__)
print('类B的所有父类：', B.__bases__)
print('类C的所有父类：', C.__bases__)

print()

## __subclasses__()方法
print('类A的所有子类：', A.__subclasses__())
print('类B的所有子类：', B.__subclasses__())
